#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021-03-26 20:15
# @Author : wxc
# @File : views.py
# @Desc :
from flask import request, jsonify, make_response, current_app
from . import passport_blue
from info import redis, db
from info.utils.captcha.captcha import captcha
from info.constants import IMAGE_CODE_REDIS_EXPIRES
from info.utils.response_code import RET

# 功能: 获取图片验证码
# 请求路径: /passport/image_code
# 请求方式: GET
# 请求参数: cur_id, pre_id
# 返回值: 图片验证码
# 图片验证码接口 前端生成一个随机数cur_id 传到后端 提交表单的时候携带该cur_id判断验证码是否正确
from ...models import User


@passport_blue.route('/image_code', methods=["GET"])
def image_code():
    """
    1. 获取参数cur_id
    2. 调用generator_captch()生成图片验证码
    3. 存储图片验证码到redis
    5. 返回一张图片,并指定图片格式
    :return:
    """
    cur_id = request.args.get("cur_id", None)
    if cur_id is None:
        return jsonify(msg="未携带cur_id", code=RET.PARAMERR)
    # 存到redis数据库中 有效期是IMAGE_CODE_REDIS_EXPIRES
    try:
        name, text, image_data = captcha.generate_captcha()
        resp = make_response(image_data)
        # 设置响应头
        resp.headers["content-type"] = 'image/png'
        redis.set(f"image_code:{cur_id}", text, IMAGE_CODE_REDIS_EXPIRES)
        return resp
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(msg="未知错误", code=RET.UNKOWNERR)


# 注册用户
# 请求路径: /passport/register
# 请求方式: POST
# 请求参数: mobile, image_code,password,cur_id
# 返回值: errno, errmsg
@passport_blue.route('/register', methods=['POST'])
def register():
    """
    1. 获取参数
    2. 校验参数,为空校验
    3. cur_id作为key取出redis中的验证码
    4. 判断验证码是否过期
    5. 判断验证码是否正确
    6. 删除验证码
    7. 创建用户对象
    8. 设置用户对象属性
    9. 保存用户到数据库
    10. 返回响应
    :return:
    """
    # 1. 获取参数
    json_data = request.get_json()
    mobile = json_data.get("mobile", "")
    image_code = json_data.get("image_code", "")
    password = json_data.get("password", "")
    cur_id = json_data.get("cur_id", "")
    # 2. 校验参数,为空校验
    if not all([mobile, image_code, password, cur_id]):
        return jsonify(code=RET.PARAMERR, msg="参数不全")
    # 3. cur_id作为key取出redis中的验证码
    code = redis.get(f"image_code:{cur_id}")
    # 4. 判断验证码是否过期
    if code is None:
        return jsonify(errno=RET.NODATA, msg="验证码已过期")
    # 5. 判断验证码是否正确
    code = code.decode("utf-8")
    if code.lower() != image_code.lower():
        return jsonify(errno=RET.DATAERR, msg="验证码错误")
    # 6. 验证码正确并且参数填写正确 删除验证码
    redis.delete(f"image_code:{cur_id}")
    # 7. 创建用户对象
    user = User()
    # 8. 设置用户对象属性
    user.nick_name = mobile
    # 密码的加密处理
    user.password = password
    user.mobile = mobile
    user.signature = "该用户很懒,什么都没写"
    # 9. 保存用户到数据库
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, msg="用户注册失败")
    # 10. 返回响应
    return jsonify(errno=RET.OK, errmsg="注册成功")
